<?php
/**
 * Arquivo de declaração da classe Módulo
 * @package controlador
 * @author Jose Berardo
 * @author Túlio Carvalho
 * @author Jasiel
 * @version 2.0
 */

/**
 * Superclasse de todos os módulos do controlador.
 * Aqui  devem ser definidas ações comuns mais de um módulo.
 */
abstract class Modulo {
  
  /**
   * Template base para as telas de todos os módulos
   * @var string
   */
  protected $templateBase;
  
  protected $title = "";
  
  private $variaveis = array();
  
  private $script = array();
  
  private $scriptEnd = array();
  
  private $msg = "";
  
  /**
   * Construtor utilizado para realizar operações
   * sempre presentes em qualquer módulo do site.
   */
  public function __construct() {
  	header('Content-type: text/html; charset=utf-8');
  }
  
  // ----- Métodos do Framework (presentes em qualquer projeto) ---- //
  
  /**
   * Método que irá incluir um arquivo de template
   * @param string $template Nome da template
   */
  protected function despachar($template) {
	ob_start();
    // Define variaveis no escopo local do template
	if(count($this->variaveis)>0){
  		foreach($this->variaveis as $_chave => $_value){
  				$$_chave = $_value;
  		}
  		
    }
    
  	if (!empty($this->templateBase)) {
  		$tela = TEMPLATE . DS . WEB_CONTENT . DS . $template;
  		require_once TEMPLATE . DS . WEB_CONTENT . DS . $this->templateBase; 
  	} else {
  		require_once TEMPLATE . DS . WEB_CONTENT  . DS . $template;
  	}
	$saida = ob_get_contents();
	ob_end_clean();

	// Varrendo todos os diretórios presentes na template atual
	foreach (new DirectoryIterator(TEMPLATE) as $arquivo) {
		if (!$arquivo->isDot() && ($arquivo->isFile() || $arquivo->isDir())) {
			$arquivos[] = $arquivo->getFilename();
		}
	}

	// Varrendo todos os módulos do sistema
	foreach (new DirectoryIterator(CONTROLADOR) as $arquivo) {
		if ($arquivo->isFile() &&
			$arquivo->getFilename() != "Modulo.php" &&
			$arquivo->getFilename() != "Controlador.php") {
			$arquivos[] = strtolower(substr($arquivo->getFilename(), 0, -4));
		}
	}
	
	// Add o title na template
	if($this->title != "")
		$saida = preg_replace("@(([<]title[>])(.*)([<]/title[>]))@i", "<title>".$this->title."</title>", $saida);
	
	// Add Js e/ou Css na template, caso seja requisitado
	if(count($this->script) > 0){
		$scripts = implode("",$this->script);
		$saida = preg_replace("@([<]head[>])((\\n?)*((.*)(\\n?)*)*)([<]/head[>])@i", "\\1\\2".$scripts."\\7", $saida);
	}
	  if(count($this->scriptEnd) > 0){
		$scriptEnd = implode("",$this->scriptEnd);
		$saida = preg_replace("@([<]/body[>])((\\n?)*((.*)(\\n?)*)*)([<]/html[>])@i", "\\1\\2".$scriptEnd."\\7", $saida);
	}
	
	
	
	
	// Inserindo o caminho em BASE para todos os links do arquivo HTML recuperado
    echo preg_replace("@((href)|(src)|(action))\\s*=\\s*(['\"]?)(" . implode("|", $arquivos). ")([/ '\"])@i", "\\1=\\5". BASE . "/\\6\\7", $saida);
    
  }
  
  /**
   * Método utilizado para encadear uma ação em outra
   *
   * @param string $modulo Nome do modulo
   * @param string $acao Metodo acao do metodo selecionado
   * @param array $parametros
   */
  protected function encaminhar($modulo, $acao, $parametros = array()) {
    Controlador::getInstancia()->set('modulo', $modulo);
    Controlador::getInstancia()->set('acao', $acao);
    Controlador::getInstancia()->set('parametros', $parametros);
    Controlador::getInstancia()->despachar();
  }
  
  /**
   * Método que ira redirecionar para uma nova URL
   * @param string $url Nova URL
   */
  protected function redirecionar($url , $completar = "") {
  	if (!$completar == ""){
  		header("Location: $url?$completar");
  	}else{
  		header("Location: $url");
  	}
    exit();
  }
  
  
  /**
   * Metodo irá configurar as variaveis para serem usadas no escopo local do template
   * @author Jaziel Matoso
   * @param mixed $valor valor da variavel a ser utilizada no escopo local do template 
   * @param mixed $chave nome da variavel que irá ser utilizada no escopo local da template
   * 
   */
   protected function setVariaveis($valor,$chave = ""){
   		$this->variaveis[$chave] = $valor;
   }
   
   protected function addCss($file){
   		$this->script[] = "\t<link type=\"text/css\" rel=\"stylesheet\" href=\"css/{$file}\" />\n";
   }
   
   protected function addJs($file , $end = true){
	   	if($end)
	   		$this->scriptEnd[] = "\t<script language=\"javascript\" src=\"js/{$file}\" type=\"text/javascript\"></script>\n";
		else   
   			$this->script[] = "\t<script language=\"javascript\" src=\"js/{$file}\" type=\"text/javascript\"></script>\n";
   }
   protected function addScript($script, $end = true){
   		if($end)
   			$this->scriptEnd[] = "\t<script language=\"javascript\" type=\"text/javascript\">\n" . "\t\t$script\n" . "\t</script>\n";
   		else
   			$this->script[] = "\t<script language=\"javascript\" type=\"text/javascript\">\n" . "\t\t$script\n" . "\t</script>\n";
   }
   
   protected function setTitle($valor){
   		$this->title = $valor;
   }
   protected function errorPage(){  	
  	 $this->despachar("404.php");
   }
   protected function setMessage($message) {
		$_SESSION ["message_error_fw"] = $message;
	}
   protected function getMessage() {
   		if(isset ( $_SESSION ["message_error_fw"])){
			$this->msg = $_SESSION ["message_error_fw"];
			unset ( $_SESSION ["message_error_fw"] );
   		}
   		return $this->msg;   		
   }
}
?>